/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import dtos.ProdutoCatalogoDTO;
import entidades.ProdutoCatalogo;
import entidades.Stock;
import excecoes.EntidadeExistenteException;
import excecoes.EntidadeNaoExistenteException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Utilizador
 */
@Stateless
public class ProdutoCatalogoBean {

    @PersistenceContext
    private EntityManager em;
    
    public void criarProdutoCatalogo(int idProdutoCatalogo, float preco, String referencia, String laboratorio, String nome) throws EntidadeExistenteException{
        try {
            if(existeProdutoCatalogo(idProdutoCatalogo)){
                throw new EntidadeExistenteException();
            }
            ProdutoCatalogo produtoCatalogo =  new ProdutoCatalogo(idProdutoCatalogo, referencia, nome, preco, laboratorio);
            em.persist(produtoCatalogo);            
            
        } catch (EntidadeExistenteException e) {
            throw e;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void alterarProdutoCatalogo(int idProdutoCatalogo, float preco, String referencia, String laboratorio, String nome, int i) throws EntidadeExistenteException{
        try {
            if(existeProdutoCatalogo(idProdutoCatalogo)){
                throw new EntidadeExistenteException("Produto Catálogo já existente!");
            }
            
            ProdutoCatalogo pc = em.find(ProdutoCatalogo.class, idProdutoCatalogo);
            if(pc == null){
                throw new EntidadeNaoExistenteException("Produto Catálogo não existente!");
            }
            
            pc.setNome(nome);
            pc.setPreco(preco);
            pc.setReferencia(referencia);
            pc.setLaboratorio(laboratorio);
            em.merge(pc);
                       
        } catch (EntidadeExistenteException e) {
            throw e;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }   
    }

    
    public void removerProdutoCatalogo(int idProdutoCatalogo){
        try {
            if(!existeProdutoCatalogo(idProdutoCatalogo)){
                throw new EntidadeNaoExistenteException();
            }
            
            ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, idProdutoCatalogo);
            if(produtoCatalogo == null){
                throw new EntidadeNaoExistenteException();
            }
            em.remove(produtoCatalogo);
            
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        } 
    }

    private boolean existeProdutoCatalogo(int id) {
        return em.find(ProdutoCatalogo.class, id) != null;
    }

    public List<ProdutoCatalogoDTO> getAllProdutosCatalogo() {
        try {
            List<ProdutoCatalogo> produtosCatalogo = (List<ProdutoCatalogo>) em.createNamedQuery("findAllProdutosCatalogo").getResultList();
            return copiarProdutosCatalogoParaDTOs(produtosCatalogo);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public ProdutoCatalogoDTO getProdutoCatalogo(int id) {
        try {
            ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, id);
            if(produtoCatalogo == null){
                throw new EntidadeNaoExistenteException("Produto Catálogo com o "+id+" não existe!");
            }
            return copiarProdutoCatalogoParaDTOs(produtoCatalogo);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    private List<ProdutoCatalogoDTO> copiarProdutosCatalogoParaDTOs(List<ProdutoCatalogo> produtosCatalogo) {
        List<ProdutoCatalogoDTO> dtos = new ArrayList<>();

        for (ProdutoCatalogo pc : produtosCatalogo) {
            dtos.add(new ProdutoCatalogoDTO(pc.getId(), pc.getPreco(), pc.getReferencia(), pc.getLaboratorio(), pc.getNome(), pc.getStock().getId()));
        }
        return dtos;
        
    }

    private ProdutoCatalogoDTO copiarProdutoCatalogoParaDTOs(ProdutoCatalogo pc) {
        List<ProdutoCatalogoDTO> dtos = new ArrayList<>();
        
        dtos.add(new ProdutoCatalogoDTO(pc.getId(), pc.getPreco(), pc.getReferencia(), pc.getLaboratorio(), pc.getNome(), pc.getStock().getId()));
        return (ProdutoCatalogoDTO) dtos;
    }


    
    
}
